package com.yh.csx.bsf.ods.meta;

import java.sql.ResultSet;
import java.util.List;
import java.util.Map;
import com.alibaba.otter.canal.protocol.CanalEntry.Column;
import com.alibaba.otter.canal.protocol.CanalEntry.Header;
import com.yh.csx.bsf.ods.BaseCanalConsumer.Operate;

/**
 * 同步器接口
 * 
 * @author 	Robin.Wang
 * @date	2020-06-01
 * */

public interface OdsSyncAdapter {

	/**
	 * 批量插入
	 * */
	public void insertBatch(String dataTable,com.alibaba.otter.canal.protocol.CanalEntry.Entry[] entries) throws Exception;
	/**
	 * 批量修改
	 * */

	public void updateBatch(String dataTable,com.alibaba.otter.canal.protocol.CanalEntry.Entry[] entries) throws Exception ;

	/**
	 * 批量删除
	 * */
	public void deleteBatch(String dataTable,com.alibaba.otter.canal.protocol.CanalEntry.Entry[] entries) throws Exception;
	/**
	 * 同步表结构
	 * @param OdsTable表结构
	 * */
	void syncStructure(OdsTable table) throws Exception ;
	/**
	 * 判断表是否存在
	 * 
	 * @param table 库名.表名
	 * @return boolean
	 * @throws Exception
	 */
	public boolean existsTable(String table) throws Exception;
	/**
	 * 创建表
	 * @param dbtable 数据库名.数据表名
	 * @param List<OdsColumn> 数据列
	 * 
	 * */
	public  boolean  createTableIfNotExists(String dbtable, List<OdsColumn> columns) throws Exception;	
	/**
	 * 创建表
	 * @param database 数据库名
	 * @param table 数据表明
	 * @param List<OdsColumn> 数据列
	 * 
	 * */
	public boolean createTableIfNotExists(String database, String table, List<OdsColumn> columns) throws Exception;	
	/**
	 * 删除表
	 * 
	 * @param table 库名.表名
	 * @return boolean
	 * @throws Exception
	 * 
	 */
	public boolean dropTable(String table) throws Exception ;

	/**
	 * 重命名表名
	 * 
	 * @param oldName 原表名
	 * @param newName 新表名
	 * @return boolean
	 * @throws Exception
	 */
	public boolean renameTable(String oldName, String newName) throws Exception;

	/**
	 * 重命名表名
	 * 
	 * @param oldName 原表名
	 * @param newName 新表名
	 * @return boolean
	 * @throws Exception
	 */
	public boolean createIndex(String tableName, List<OdsIndex> indexs) throws Exception;
	
	/**
	 * 插入数据
	 * @param CanalEntry.Header Canal事件头部
	 * @param List<Column> 事件变更数据
	 * */
	public void insert(Header header, List<Column> afterColumns) throws Exception;
	/**
	 * 插入数据
	 * @param String table 数据表名
	 * @param List<OdsColumn> 插入数据
	 * */
	public boolean insert(String table, List<OdsColumn> columns) throws Exception;
	
	/**
	 * 更新数据
	 * @param CanalEntry.Header Canal事件头部
	 * @param List<Column> beforeColumns 事件变更前数据
	 * @param List<Column> afterColumns 事件变更后数据
	 * */
	public void update(Header header, List<Column> beforeColumns, List<Column> afterColumns) throws Exception;
	/**
	 * 删除数据
	 * @param CanalEntry.Header Canal事件头部
	 * @param List<Column> beforeColumns 事件变更前数据
	 * */
	public void delete(Header header, List<Column> beforeColumns) throws Exception;

	/**
	 * 批量插入数据
	 * */
	public boolean insertBatchMap(String table, List<Map<String, Object>> data,OdsTable tableStructure) throws Exception;
	/**
	 * 批处理
	 * */
	public boolean process(List<Operate> list) throws Exception;
	/**
	 * 批量创建视图
	 * */
	public boolean createViews() throws Exception;
	/**
	 * 查询数量
	 * */
	public Integer selectCount(String sql);
	
	/**
	 * 查询
	 * */
	public ResultSet query(String sql) throws Exception ;
	
}
